A partir de los datos sacados de la web ExploitDB y de Twitter vamos a realizar un análisis para responder las siguientes preguntas:
El proyecto está compuesto por el proyecto principal, el cual llama a diferentes funciones para realizar y mostrar la correlación de los datos en el cual se basa este estudio, y un package, éste proporciona las funciones comentadas anteriormente, así como su implementación y la obtención de los datos.
A continuación, se exponen los resultados obtenidos de ExploitDB y se hace una comparativa de los exploits y vulnerabiliadades de los últimos 7 días con los obtenidos a partir del año 2000. El objetivo es contrastar si los datos de los últimos 7 días se pueden considerar una buena muestra.
Después de la comparativa, se correlarán los exploits con los tweets de alrededor del mundo de la última semana. Se ha escogido este período de tiempo debido a que la API de Twitter está limitada.
Por último, se sacan unas conclusiones para determinar si con los datos obtenidos y el estudio realizado ha sido suficiente para responder las preguntas planteadas.
Nos nutrimos a base de un repositorio de Github. Éste pone a disposición de cualquier usuario un archivo csv con más de 37000 vulnerabilidades que además, se actualiza a diario. Cada vulnerabilidad nos proporciona información relevante como la id del exploit correspondiente en exploitDB, una descripción, la fecha de agregación a exploitDB, el autor, la plataforma a la cual afecta, el tipo de vulnerabilidad y una descripción mas específica de este.
Obtenemos el fichero CSV mediante la función:
get_exploitdb_All <- function() {
csv <- RCurl::getURL("https://raw.githubusercontent.com/offensive-security/exploit-database/master/files.csv")
db <- read.csv(text = csv,stringsAsFactors = F)
return(db)
}
Si se analizan las dos gráficas, se puede observar claramente que con mucha diferencia las plataformas de PHP y Windows son las que mas exploits tienen. No obstante, los datos obtenidos de la última semana no muestran este resultado. Aunque sigue predominando Windows, muy empatado con los otros sistemas operativos Linux y OS X, PHP no tiene tanto peso.
Por lo tanto, cuando se haga la correlación se debe tener en cuenta que las plataformas con las que se ha cruzado la información con Twitter no se pueden considerar como un resultado absoluto, no se debería generalizar.
A continuación podemos ver la actividad que ha habido en twitter en las últimas 24 horas de las plataformas más susceptibles a ataques.
En el caso de los exploits se ha visto que puede varíar mucho entre semanas debido a que muchas veces los tipos vienen en bloque. Es decir, dada una vulnerabilidad pueden salir exploits diferentes pero del mismo tipo. Por lo tanto, no se debería generalizar.
Cada uno de los tipos de exploits especificados en el apartado anterior tiene una descripción más específica de la vulnerabilidad en cuestión. En este caso, es muy probable que los resultados sean diferentes entre si y por eso en la gráfica salen porcentajes tan iguales. Como dato curioso, SQL injection és el tipo de vulnerabilidad mas explotada en los últimos 20 años.
La api de twitter nos proporciona la información necesaria para el estudio que queremos realizar. Para ello obtenemos un json al mandar una query contra la api. Al obtener el json parseamos su contenido y con ello obtenemos un dataframe con los datos que utilizaremos como el nombre de usuario, la ubicación del usuario, la coordenadas geográficas, el texto publicado y la hora de la publicación.
tweets_raw <- RCurl::getForm(u, .params = args, crlf = TRUE)
tweets_parsed <- gsub('[\r\n]', '', tweets_raw[1])
tweets_json <- RJSONIO::fromJSON(tweets_parsed, simplify = TRUE)
users <- sapply(tweets_json[['statuses']], function(x) x[['user']][['name']])
locations <- sapply(tweets_json[['statuses']], function(x) x[['user']][['location']])
geo <- as.data.frame.matrix(t(sapply(X = locations, FUN = geoCode)))
tweets <- sapply(tweets_json[['statuses']], function(x) x[['text']])
timestamps <- strptime(sapply(tweets_json[['statuses']], function(x) x[['created_at']]), '%a %b %d %H:%M:%S %z %Y')
result <- data.frame(User = users, Location = locations, Location_detected = geo$V4, Latitude = geo$V1, Longitude = geo$V2, Tweet = tweets, Date = timestamps)
result <- dplyr::filter(result, Date >= strptime(s, '%Y-%m-%d'))
return(result)
Se ha analizado cuantos tweets se han hecho en los últimos 7 días que tengan relación con la plataforma y tipo de exploit. En la siguiente tabla se muestran duplicadas para poderla relacionar mejor con las vulnerabilidades.
## [1] "linux vulnerability" "windows vulnerability"
## [3] "windows vulnerability" "windows vulnerability"
## [5] "win_x86-64 vulnerability" "php vulnerability"
## [7] "php vulnerability" "jsp vulnerability"
A continuación, se muestran las palabras correspondientes a las vulnerabilidades de los últimos 7 días y debajo la gráfica correspondiente al número de tweets realizado el primer dia (rojo), el segundo dia (verde) y el tercer dia (azul).